package com.lhl.mq.mqServer.datacenter;

import com.lhl.mq.common.MqException;
import com.lhl.mq.mqServer.core.Binding;
import com.lhl.mq.mqServer.core.Exchange;
import com.lhl.mq.mqServer.core.MSGQueue;
import com.lhl.mq.mqServer.core.Message;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * 使用该类用来管理所有硬盘上的数据
 * 1.数据库：交换机，绑定，队列
 * 2、数据：消息
 * 上层逻辑如果需要操作硬盘，统一通过这个类来调用
 * 上层代码不关心当前数据是存储在数据库中还是文件中
 */
public class DiskDataCenter {
    //这个实例用来管理数据库里中的数据
    private DataBaseManager dataBaseManager = new DataBaseManager();
    //这个实例用来管理文件中的数据
    private MessageFileManager messageFileManager = new MessageFileManager();

    //对上面两个实例进行初始化
    public void  init(){
        dataBaseManager.init();;
        messageFileManager.init();
    }

    //封装交换机操作
    public void insertExchange(Exchange exchange){
        dataBaseManager.insertExchange(exchange);
    }

    public List<Exchange> selectAllExchanges(){
        return dataBaseManager.selectExchange();
    }

    public void deleteExchange(String exchangerName){
        dataBaseManager.deleteExchange(exchangerName);
    }

    //封装绑定
    public void insertBinding(Binding binding){
        dataBaseManager.insertBinding(binding);
    }

    public List<Binding> selectAllBindings(){
        return dataBaseManager.selectBinding();
    }

    public void deleteBinding(Binding binding){
        dataBaseManager.deleteBinding(binding);
    }

    //封装队列
    public void insertQueue(MSGQueue queue) throws IOException {
        dataBaseManager.insertQueue(queue);
        //创建队列的时候，要把队列对应的目录和文件都创建
        messageFileManager.createQueueFiles(queue.getName());
    }

    public List<MSGQueue> selectAllQueues(){
        return dataBaseManager.selectQueue();
    }

    public void deleteQueue(String queueName) throws IOException {
        dataBaseManager.deleteQueue(queueName);
        //要把对应的目录和文件都删除
        messageFileManager.deleteQueueFiles(queueName);
    }

    //封装消息
    public void sendMessage(MSGQueue queue,Message message) throws IOException, MqException {
        messageFileManager.sendMessage(queue,message);
    }

    public void deleteMessage(MSGQueue queue,Message message) throws IOException, ClassNotFoundException, MqException {
        messageFileManager.deleteMessage(queue,message);
        //删除一条消息后，无效的消息就增加了一条，此时判断一下是否需要进行gc
        if (messageFileManager.checkGC(queue.getName())){
            messageFileManager.gc(queue);
        }
    }

    public LinkedList<Message> loadAllMessages(String queueName) throws IOException, MqException, ClassNotFoundException {
        return messageFileManager.loadMessageAllFromQueue(queueName);
    }



}
